package com.musemun.controller;

import com.google.zxing.WriterException;
import com.musemun.common.CommonResult;
import com.musemun.config.MyDefineAnnotation;
import com.musemun.pojo.Crifo;
import com.musemun.pojo.Cropifo;
import com.musemun.pojo.ResultPhoto;
import com.musemun.service.CrifoService;
import com.musemun.service.CropifoService;
import com.musemun.service.function.CrifoIn;
import com.musemun.util.ExcelUtil;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * <p>
 *
 * </p>
 * @author winner
 * @date 2020/4/28
 */
@RestController
@RequestMapping("import_crifo")
@Api(tags="入库功能模块")
public class InController {
    private static Logger log= LoggerFactory.getLogger(InController.class);
    @Resource
    CrifoIn crifoIn;
    @Resource
    CrifoService crifoService;
    @Resource
    CropifoService cropifoService;
    /**
     *
     * @param file excel文件
     * @return com.musemun.common.ResultCode
     */
    @ApiOperation("excel文件上传更新Crifo数据库功能")
    @PutMapping("/import_excel")
    public CommonResult<String> importExcel(MultipartFile file) throws IOException {
        InputStream inputStream = file.getInputStream();
        crifoIn.ExcelUpload(inputStream);
        return new CommonResult<>(200,file.getOriginalFilename()+"excel表录入数据库成功");
    }


    /**
     *
     * @param file  图片 可以是一张也可以是多张
     * @return com.musemun.common.CommonResult<java.lang.String>
     */
    @ApiOperation("文物拍照入库码,输入的是图片")
    @PostMapping("/import_photo")
    @MyDefineAnnotation
    public CommonResult<List<ResultPhoto>> importPhoto(MultipartFile[] file) throws IOException {
        List<String> fileList= new ArrayList<>();
        for (int i = 0; i < file.length; i++) {
            fileList.add(UUID.randomUUID().toString().replace("-", "")+".jpeg");
        }
        //文件上传
        crifoIn.photoInsert(file,fileList);
        //存入crifo到数据库
        List<Crifo> crifoList = StringToCrifo(fileList);
        crifoService.saveBatch(crifoList);
        //记录到cropifo
        cropifoService.insertCropifo(crifoList,0);
        //pojo->DTO
        ArrayList<ResultPhoto> ResultList=new ArrayList<>();
        crifoList.forEach(data->{
            try {
                ResultList.add(new ResultPhoto(data));
            } catch (IOException | WriterException e) {
                e.printStackTrace();
            }
        });
        return new CommonResult<>(200,"插入"+file.length+"条数据成功",ResultList);
    }

    /**
     *   说白了这就是一个POJO=>DTO的函数
     *
     * @param list 文件名的容器
     * @return java.util.List<com.musemun.pojo.Crifo>
     */
    public List<Crifo> StringToCrifo(List<String> list){
        List<Crifo> crifoList = new LinkedList<>();
        list.forEach(fileName->crifoList.add(new Crifo("/img/"+fileName)));
        return crifoList;
    }

//    /**
//     * description:
//     *  这是一个没用的测试方法，
//     */
//    @GetMapping("test")
//    public boolean test() throws FileNotFoundException {
//        String PATH= ResourceUtils.getURL("classpath:").getPath() + "/static/img";
//        File file =new File(PATH);
//        String[] str=file.list();
//        assert str != null;
//        List<String> list = new ArrayList<>(Arrays.asList(str));
//        List<Crifo> list1 = new ArrayList<>();
//        list.forEach(id->{
//            String[] s=id.split("_");
//            Long i=Long.parseLong(s[0]);
//            System.out.println(i);
//            Crifo crifo = new Crifo();
//            crifo.setCrNo(i);
//            crifo.setCrPic("/img/"+id);
//            list1.add(crifo);
//        });
//        CrifoServiceImpl crifoService=new CrifoServiceImpl();
//        System.out.println(list1);
//        return crifoService.updateBatchById(list1);
//    }


    /**
     *   导出数据库中的所有数据 按照excel
     *    使用id选择导出的数据 1为导出所有，2为导出需要入库的excel，3为导出所有已经入库的excel
     * @return com.musemun.common.CommonResult<java.lang.String>
     */
    @ApiOperation("0为导出所有，1为导出需要入库的excel，2为导出所有已经入库的excel")
    @GetMapping("export_excel/{index}")
    public void excelExport(@PathVariable int index,HttpServletResponse response) throws IOException {
        List<Crifo> crifoList = crifoService.ByIndexQuery(index);
        log.info("文物解析开始");
        ExcelUtil.ExcelDownload(crifoList,response);
        log.info("文物表下载成功");
    }

    @ApiOperation("0为导出所有，1为导出需要入库的excel，2为导出所有已经入库的excel")
    @GetMapping("excel_query/{id}")
    public CommonResult<List<Crifo>> query(@PathVariable int  id){
        List<Crifo> crifoList = crifoService.ByIndexQuery(id);
        if(crifoList==null)
            return new CommonResult<>(404,"没用查询到数据");
        else
            return new CommonResult<>(200,"查询到数据"+crifoList.size(),crifoList);
    }
}
